{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## import所需库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "# bs4 nltk gensim\n",
    "import os\n",
    "import re\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from bs4 import BeautifulSoup\n",
    "\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "import nltk\n",
    "from nltk.corpus import stopwords"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "showing info https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nltk.download()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 用pandas读入训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "scrolled": true,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of reviews: 25000\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "      <th>review</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5814_8</td>\n",
       "      <td>1</td>\n",
       "      <td>With all this stuff going down at the moment w...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2381_9</td>\n",
       "      <td>1</td>\n",
       "      <td>\"The Classic War of the Worlds\" by Timothy Hin...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7759_3</td>\n",
       "      <td>0</td>\n",
       "      <td>The film starts with a manager (Nicholas Bell)...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3630_4</td>\n",
       "      <td>0</td>\n",
       "      <td>It must be assumed that those who praised this...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>9495_8</td>\n",
       "      <td>1</td>\n",
       "      <td>Superbly trashy and wondrously unpretentious 8...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id  sentiment                                             review\n",
       "0  5814_8          1  With all this stuff going down at the moment w...\n",
       "1  2381_9          1  \"The Classic War of the Worlds\" by Timothy Hin...\n",
       "2  7759_3          0  The film starts with a manager (Nicholas Bell)...\n",
       "3  3630_4          0  It must be assumed that those who praised this...\n",
       "4  9495_8          1  Superbly trashy and wondrously unpretentious 8..."
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('../data/labeledTrainData.tsv', sep='\\t', escapechar='\\\\')\n",
    "print('Number of reviews: {}'.format(len(df)))\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 对影评数据做预处理，大概有以下环节：\n",
    "\n",
    "1. 去掉html标签\n",
    "1. 移除标点\n",
    "1. 切分成词/token\n",
    "1. 去掉停用词\n",
    "1. 重组为新的句子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"I watched this movie really late last night and usually if it's late then I'm pretty forgiving of movies. Although I tried, I just could not stand this movie at all, it kept getting worse and worse as the movie went on. Although I know it's suppose to be a comedy but I didn't find it very funny. It was also an especially unrealistic, and jaded portrayal of rural life. In case this is what any of you think country life is like, it's definitely not. I do have to agree that some of the guy cast members were cute, but the french guy was really fake. I do have to agree that it tried to have a good lesson in the story, but overall my recommendation is that no one over 8 watch it, it's just too annoying.\""
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['review'][1000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"I watched this movie really late last night and usually if it's late then I'm pretty forgiving of movies. Although I tried, I just could not stand this movie at all, it kept getting worse and worse as the movie went on. Although I know it's suppose to be a comedy but I didn't find it very funny. It was also an especially unrealistic, and jaded portrayal of rural life. In case this is what any of you think country life is like, it's definitely not. I do have to agree that some of the guy cast members were cute, but the french guy was really fake. I do have to agree that it tried to have a good lesson in the story, but overall my recommendation is that no one over 8 watch it, it's just too annoying.\""
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#去掉HTML标签的数据\n",
    "example = BeautifulSoup(df['review'][1000], 'html.parser').get_text()\n",
    "example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'I watched this movie really late last night and usually if it s late then I m pretty forgiving of movies  Although I tried  I just could not stand this movie at all  it kept getting worse and worse as the movie went on  Although I know it s suppose to be a comedy but I didn t find it very funny  It was also an especially unrealistic  and jaded portrayal of rural life  In case this is what any of you think country life is like  it s definitely not  I do have to agree that some of the guy cast members were cute  but the french guy was really fake  I do have to agree that it tried to have a good lesson in the story  but overall my recommendation is that no one over   watch it  it s just too annoying '"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#去掉标点符号\n",
    "example_letters = re.sub(r'[^a-zA-Z]', ' ', example)\n",
    "example_letters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['i',\n",
       " 'watched',\n",
       " 'this',\n",
       " 'movie',\n",
       " 'really',\n",
       " 'late',\n",
       " 'last',\n",
       " 'night',\n",
       " 'and',\n",
       " 'usually',\n",
       " 'if',\n",
       " 'it',\n",
       " 's',\n",
       " 'late',\n",
       " 'then',\n",
       " 'i',\n",
       " 'm',\n",
       " 'pretty',\n",
       " 'forgiving',\n",
       " 'of',\n",
       " 'movies',\n",
       " 'although',\n",
       " 'i',\n",
       " 'tried',\n",
       " 'i',\n",
       " 'just',\n",
       " 'could',\n",
       " 'not',\n",
       " 'stand',\n",
       " 'this',\n",
       " 'movie',\n",
       " 'at',\n",
       " 'all',\n",
       " 'it',\n",
       " 'kept',\n",
       " 'getting',\n",
       " 'worse',\n",
       " 'and',\n",
       " 'worse',\n",
       " 'as',\n",
       " 'the',\n",
       " 'movie',\n",
       " 'went',\n",
       " 'on',\n",
       " 'although',\n",
       " 'i',\n",
       " 'know',\n",
       " 'it',\n",
       " 's',\n",
       " 'suppose',\n",
       " 'to',\n",
       " 'be',\n",
       " 'a',\n",
       " 'comedy',\n",
       " 'but',\n",
       " 'i',\n",
       " 'didn',\n",
       " 't',\n",
       " 'find',\n",
       " 'it',\n",
       " 'very',\n",
       " 'funny',\n",
       " 'it',\n",
       " 'was',\n",
       " 'also',\n",
       " 'an',\n",
       " 'especially',\n",
       " 'unrealistic',\n",
       " 'and',\n",
       " 'jaded',\n",
       " 'portrayal',\n",
       " 'of',\n",
       " 'rural',\n",
       " 'life',\n",
       " 'in',\n",
       " 'case',\n",
       " 'this',\n",
       " 'is',\n",
       " 'what',\n",
       " 'any',\n",
       " 'of',\n",
       " 'you',\n",
       " 'think',\n",
       " 'country',\n",
       " 'life',\n",
       " 'is',\n",
       " 'like',\n",
       " 'it',\n",
       " 's',\n",
       " 'definitely',\n",
       " 'not',\n",
       " 'i',\n",
       " 'do',\n",
       " 'have',\n",
       " 'to',\n",
       " 'agree',\n",
       " 'that',\n",
       " 'some',\n",
       " 'of',\n",
       " 'the',\n",
       " 'guy',\n",
       " 'cast',\n",
       " 'members',\n",
       " 'were',\n",
       " 'cute',\n",
       " 'but',\n",
       " 'the',\n",
       " 'french',\n",
       " 'guy',\n",
       " 'was',\n",
       " 'really',\n",
       " 'fake',\n",
       " 'i',\n",
       " 'do',\n",
       " 'have',\n",
       " 'to',\n",
       " 'agree',\n",
       " 'that',\n",
       " 'it',\n",
       " 'tried',\n",
       " 'to',\n",
       " 'have',\n",
       " 'a',\n",
       " 'good',\n",
       " 'lesson',\n",
       " 'in',\n",
       " 'the',\n",
       " 'story',\n",
       " 'but',\n",
       " 'overall',\n",
       " 'my',\n",
       " 'recommendation',\n",
       " 'is',\n",
       " 'that',\n",
       " 'no',\n",
       " 'one',\n",
       " 'over',\n",
       " 'watch',\n",
       " 'it',\n",
       " 'it',\n",
       " 's',\n",
       " 'just',\n",
       " 'too',\n",
       " 'annoying']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "words = example_letters.lower().split()\n",
    "words"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#下载停用词和其他语料会用到\n",
    "#nltk.download()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['watched',\n",
       " 'movie',\n",
       " 'late',\n",
       " 'night',\n",
       " 'late',\n",
       " 'pretty',\n",
       " 'forgiving',\n",
       " 'movies',\n",
       " 'stand',\n",
       " 'movie',\n",
       " 'worse',\n",
       " 'worse',\n",
       " 'movie',\n",
       " 'suppose',\n",
       " 'comedy',\n",
       " 'didn',\n",
       " 'funny',\n",
       " 'unrealistic',\n",
       " 'jaded',\n",
       " 'portrayal',\n",
       " 'rural',\n",
       " 'life',\n",
       " 'country',\n",
       " 'life',\n",
       " 'agree',\n",
       " 'guy',\n",
       " 'cast',\n",
       " 'cute',\n",
       " 'french',\n",
       " 'guy',\n",
       " 'fake',\n",
       " 'agree',\n",
       " 'lesson',\n",
       " 'story',\n",
       " 'recommendation',\n",
       " 'watch',\n",
       " 'annoying']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#去停用词\n",
    "stopwords = {}.fromkeys([ line.rstrip() for line in open('../stopwords.txt')])\n",
    "words_nostop = [w for w in words if w not in stopwords]\n",
    "words_nostop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "eng_stopwords = set(stopwords)\n",
    "\n",
    "def clean_text(text):\n",
    "    text = BeautifulSoup(text, 'html.parser').get_text()\n",
    "    text = re.sub(r'[^a-zA-Z]', ' ', text)\n",
    "    words = text.lower().split()\n",
    "    words = [w for w in words if w not in eng_stopwords]\n",
    "    return ' '.join(words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"I watched this movie really late last night and usually if it's late then I'm pretty forgiving of movies. Although I tried, I just could not stand this movie at all, it kept getting worse and worse as the movie went on. Although I know it's suppose to be a comedy but I didn't find it very funny. It was also an especially unrealistic, and jaded portrayal of rural life. In case this is what any of you think country life is like, it's definitely not. I do have to agree that some of the guy cast members were cute, but the french guy was really fake. I do have to agree that it tried to have a good lesson in the story, but overall my recommendation is that no one over 8 watch it, it's just too annoying.\""
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['review'][1000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'watched movie late night late pretty forgiving movies stand movie worse worse movie suppose comedy didn funny unrealistic jaded portrayal rural life country life agree guy cast cute french guy fake agree lesson story recommendation watch annoying'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clean_text(df['review'][1000])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 清洗数据添加到dataframe里"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "      <th>review</th>\n",
       "      <th>clean_review</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5814_8</td>\n",
       "      <td>1</td>\n",
       "      <td>With all this stuff going down at the moment w...</td>\n",
       "      <td>stuff moment mj ve started listening music wat...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2381_9</td>\n",
       "      <td>1</td>\n",
       "      <td>\"The Classic War of the Worlds\" by Timothy Hin...</td>\n",
       "      <td>classic war worlds timothy hines entertaining ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7759_3</td>\n",
       "      <td>0</td>\n",
       "      <td>The film starts with a manager (Nicholas Bell)...</td>\n",
       "      <td>film starts manager nicholas bell investors ro...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3630_4</td>\n",
       "      <td>0</td>\n",
       "      <td>It must be assumed that those who praised this...</td>\n",
       "      <td>assumed praised film filmed opera didn read do...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>9495_8</td>\n",
       "      <td>1</td>\n",
       "      <td>Superbly trashy and wondrously unpretentious 8...</td>\n",
       "      <td>superbly trashy wondrously unpretentious explo...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id  sentiment                                             review  \\\n",
       "0  5814_8          1  With all this stuff going down at the moment w...   \n",
       "1  2381_9          1  \"The Classic War of the Worlds\" by Timothy Hin...   \n",
       "2  7759_3          0  The film starts with a manager (Nicholas Bell)...   \n",
       "3  3630_4          0  It must be assumed that those who praised this...   \n",
       "4  9495_8          1  Superbly trashy and wondrously unpretentious 8...   \n",
       "\n",
       "                                        clean_review  \n",
       "0  stuff moment mj ve started listening music wat...  \n",
       "1  classic war worlds timothy hines entertaining ...  \n",
       "2  film starts manager nicholas bell investors ro...  \n",
       "3  assumed praised film filmed opera didn read do...  \n",
       "4  superbly trashy wondrously unpretentious explo...  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['clean_review'] = df.review.apply(clean_text)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 抽取bag of words特征(用sklearn的CountVectorizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000, 5000)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vectorizer = CountVectorizer(max_features = 5000) \n",
    "train_data_features = vectorizer.fit_transform(df.clean_review).toarray()\n",
    "train_data_features.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cross_validation import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(train_data_features,df.sentiment,test_size = 0.2, random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import itertools\n",
    "def plot_confusion_matrix(cm, classes,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues):\n",
    "    \"\"\"\n",
    "    This function prints and plots the confusion matrix.\n",
    "    \"\"\"\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title)\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=0)\n",
    "    plt.yticks(tick_marks, classes)\n",
    "\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, cm[i, j],\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.ylabel('True label')\n",
    "    plt.xlabel('Predicted label')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall metric in the testing dataset:  0.853181076672\n",
      "accuracy metric in the testing dataset:  0.8454\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdcAAAGbCAYAAACWHtrWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XecFdX5x/HPl64EEFEWiWKJivwSC2pULFiwxoRYY9dg\n7Iol0Vii0WgSSywERWOLGmNDjFFRwU4UERRBowJWQFQgyCpNQdjn98fM4t3rAvdeZtndy/fta17s\nnnlm5swF99lz5pwzigjMzMwsO03quwJmZmblxsnVzMwsY06uZmZmGXNyNTMzy5iTq5mZWcacXM3M\nzDLm5GpmZpYxJ1czM7OMObmamZllzMnVGh1JG0p6StIXkhZJ6p3x+deVVCXp6CzPWw4kTZT09/qu\nh1lD5+RqJZG0gaSbJX0g6StJX0p6SdLpklrV8eX/AfwQuAA4CnitDq5R1uuCSuom6WJJXYo8tIoy\n/2zMsiCvLWzFkrQvMBD4miTRvQW0AHYEDgTujIiT6ujarYB5wGURcXFdXCO9TgvgmyjT/0EkHQg8\nCOwSEf8p4rjmQFVELKqzypmVgWb1XQFrXCStB9wHfATsFhHTc3bfJOkiYN86rELH9M8v6/AaRMSC\nujx/AyCKaIFKahURX0fEN3VYJ7Oy4W5hK9a5QGvgV3mJFYCI+DAirq/+XlJTSRdJel/S15I+kvSn\ntGVITtxESY9K2kHSyLSr+QNJR+XEXAxMJEkKV6fPRT9M990p6aP8+ki6RFJVXtkekl6UVClptqTx\nkv6Us7/WZ66SdkuPm5Me+29Jm9R2PUk/SOtUmT4b/nsh3eWSXpD0pqRN06/nSnovbWkiaWdJr0ia\nl9a7V97xXSTdmO6bJ2mGpIGS1s2JOYak5wHghbS+iyT1zPu72FPSq5K+Ak7I2ff3nHM9J2m6pDVy\nyppL+m9a71WWdc9m5cjJ1Yr1U+DDiBhZYPztwB9InoueCbwAnE/S+s0VwEYkXZVPAb8GZgJ3SOqW\nxjyUnkPAvcCR6ffVx9fWEqtRLun/gMeA5sBF6XUeAbZf2k1I2h0YAqwBXAxckx7zUt5zy+prDST5\nJeQ84AHgmPS4ZQlg9bSOrwDnkHS/3yfpFySf22C+/SXnQUmtc47/MbBdGtcXuAnoBTyfk9yHAf3T\nr/9I8jkeBYzLqcMmJJ/xU8DpwNi8+6t2LNAK+FtO2aVAN+CXEfFVAfdsVn4iwpu3gjagDcmAln8V\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x262eb927240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "LR_model = LogisticRegression()\n",
    "LR_model = LR_model.fit(X_train, y_train)\n",
    "y_pred = LR_model.predict(X_test)\n",
    "cnf_matrix = confusion_matrix(y_test,y_pred)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "print(\"accuracy metric in the testing dataset: \", (cnf_matrix[1,1]+cnf_matrix[0,0])/(cnf_matrix[0,0]+cnf_matrix[1,1]+cnf_matrix[1,0]+cnf_matrix[0,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of reviews: 50000\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>review</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>9999_0</td>\n",
       "      <td>Watching Time Chasers, it obvious that it was ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>45057_0</td>\n",
       "      <td>I saw this film about 20 years ago and remembe...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>15561_0</td>\n",
       "      <td>Minor Spoilers&lt;br /&gt;&lt;br /&gt;In New York, Joan Ba...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7161_0</td>\n",
       "      <td>I went to see this film with a great deal of e...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>43971_0</td>\n",
       "      <td>Yes, I agree with everyone on this site this m...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        id                                             review\n",
       "0   9999_0  Watching Time Chasers, it obvious that it was ...\n",
       "1  45057_0  I saw this film about 20 years ago and remembe...\n",
       "2  15561_0  Minor Spoilers<br /><br />In New York, Joan Ba...\n",
       "3   7161_0  I went to see this film with a great deal of e...\n",
       "4  43971_0  Yes, I agree with everyone on this site this m..."
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('../data/unlabeledTrainData.tsv', sep='\\t', escapechar='\\\\')\n",
    "print('Number of reviews: {}'.format(len(df)))\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>review</th>\n",
       "      <th>clean_review</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>9999_0</td>\n",
       "      <td>Watching Time Chasers, it obvious that it was ...</td>\n",
       "      <td>watching time chasers obvious bunch friends si...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>45057_0</td>\n",
       "      <td>I saw this film about 20 years ago and remembe...</td>\n",
       "      <td>film ago remember nasty based true incident br...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>15561_0</td>\n",
       "      <td>Minor Spoilers&lt;br /&gt;&lt;br /&gt;In New York, Joan Ba...</td>\n",
       "      <td>minor spoilersin york joan barnard elvire audr...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7161_0</td>\n",
       "      <td>I went to see this film with a great deal of e...</td>\n",
       "      <td>film deal excitement school director friend mi...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>43971_0</td>\n",
       "      <td>Yes, I agree with everyone on this site this m...</td>\n",
       "      <td>agree site movie bad call movie insult movies ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        id                                             review  \\\n",
       "0   9999_0  Watching Time Chasers, it obvious that it was ...   \n",
       "1  45057_0  I saw this film about 20 years ago and remembe...   \n",
       "2  15561_0  Minor Spoilers<br /><br />In New York, Joan Ba...   \n",
       "3   7161_0  I went to see this film with a great deal of e...   \n",
       "4  43971_0  Yes, I agree with everyone on this site this m...   \n",
       "\n",
       "                                        clean_review  \n",
       "0  watching time chasers obvious bunch friends si...  \n",
       "1  film ago remember nasty based true incident br...  \n",
       "2  minor spoilersin york joan barnard elvire audr...  \n",
       "3  film deal excitement school director friend mi...  \n",
       "4  agree site movie bad call movie insult movies ...  "
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['clean_review'] = df.review.apply(clean_text)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000,)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "review_part = df['clean_review']\n",
    "review_part.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "50000 reviews -> 50000 sentences\n"
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "\n",
    "tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')\n",
    "\n",
    "\n",
    "def split_sentences(review):\n",
    "    raw_sentences = tokenizer.tokenize(review.strip())\n",
    "    sentences = [clean_text(s) for s in raw_sentences if s]\n",
    "    return sentences\n",
    "sentences = sum(review_part.apply(split_sentences), [])\n",
    "print('{} reviews -> {} sentences'.format(len(review_part), len(sentences)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'watching time chasers obvious bunch friends sitting day film school hey pool money bad movie bad movie dull story bad script lame acting poor cinematography bottom barrel stock music corners cut prevented film release life'"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sentences[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sentences_list = []\n",
    "for line in sentences:\n",
    "    sentences_list.append(nltk.word_tokenize(line))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-  sentences：可以是一个list\n",
    "-  sg： 用于设置训练算法，默认为0，对应CBOW算法；sg=1则采用skip-gram算法。\n",
    "-  size：是指特征向量的维度，默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。\n",
    "-  window：表示当前词与预测词在一个句子中的最大距离是多少\n",
    "-  alpha: 是学习速率\n",
    "-  seed：用于随机数发生器。与初始化词向量有关。\n",
    "-  min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5\n",
    "-  max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个，则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。\n",
    "\n",
    "-  workers参数控制训练的并行数。\n",
    "-  hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0（defau·t），则negative sampling会被使用。\n",
    "-  negative: 如果>0,则会采用negativesamp·ing，用于设置多少个noise words\n",
    "-  iter： 迭代次数，默认为5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 设定词向量训练的参数\n",
    "num_features = 300    # Word vector dimensionality\n",
    "min_word_count = 40   # Minimum word count\n",
    "num_workers = 4       # Number of threads to run in parallel\n",
    "context = 10          # Context window size\n",
    "model_name = '{}features_{}minwords_{}context.model'.format(num_features, min_word_count, context)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from gensim.models.word2vec import Word2Vec\n",
    "model = Word2Vec(sentences_list, workers=num_workers, \\\n",
    "            size=num_features, min_count = min_word_count, \\\n",
    "            window = context)\n",
    "\n",
    "# If you don't plan to train the model any further, calling \n",
    "# init_sims will make the model much more memory-efficient.\n",
    "model.init_sims(replace=True)\n",
    "\n",
    "# It can be helpful to create a meaningful model name and \n",
    "# save the model for later use. You can load it later using Word2Vec.load()\n",
    "model.save(os.path.join('..', 'models', model_name))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "kitchen\n"
     ]
    }
   ],
   "source": [
    "print(model.doesnt_match(['man','woman','child','kitchen']))\n",
    "#print(model.doesnt_match('france england germany berlin'.split())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('girl', 0.7018299698829651),\n",
       " ('astro', 0.6647905707359314),\n",
       " ('teenage', 0.6317306160926819),\n",
       " ('frat', 0.60948246717453),\n",
       " ('dad', 0.6011481285095215),\n",
       " ('yr', 0.6010577082633972),\n",
       " ('teenager', 0.5974895358085632),\n",
       " ('brat', 0.5941195487976074),\n",
       " ('joshua', 0.5832049250602722),\n",
       " ('father', 0.5825375914573669)]"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.most_similar(\"boy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('worse', 0.7071679830551147),\n",
       " ('horrible', 0.7065873742103577),\n",
       " ('terrible', 0.6872220635414124),\n",
       " ('sucks', 0.6666240692138672),\n",
       " ('crappy', 0.6634873747825623),\n",
       " ('lousy', 0.6494461297988892),\n",
       " ('horrendous', 0.6371070742607117),\n",
       " ('atrocious', 0.62550288438797),\n",
       " ('suck', 0.6224384307861328),\n",
       " ('awful', 0.619296669960022)]"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.most_similar(\"bad\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "      <th>review</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5814_8</td>\n",
       "      <td>1</td>\n",
       "      <td>With all this stuff going down at the moment w...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2381_9</td>\n",
       "      <td>1</td>\n",
       "      <td>\"The Classic War of the Worlds\" by Timothy Hin...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7759_3</td>\n",
       "      <td>0</td>\n",
       "      <td>The film starts with a manager (Nicholas Bell)...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3630_4</td>\n",
       "      <td>0</td>\n",
       "      <td>It must be assumed that those who praised this...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>9495_8</td>\n",
       "      <td>1</td>\n",
       "      <td>Superbly trashy and wondrously unpretentious 8...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id  sentiment                                             review\n",
       "0  5814_8          1  With all this stuff going down at the moment w...\n",
       "1  2381_9          1  \"The Classic War of the Worlds\" by Timothy Hin...\n",
       "2  7759_3          0  The film starts with a manager (Nicholas Bell)...\n",
       "3  3630_4          0  It must be assumed that those who praised this...\n",
       "4  9495_8          1  Superbly trashy and wondrously unpretentious 8..."
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('../data/labeledTrainData.tsv', sep='\\t', escapechar='\\\\')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>290</th>\n",
       "      <th>291</th>\n",
       "      <th>292</th>\n",
       "      <th>293</th>\n",
       "      <th>294</th>\n",
       "      <th>295</th>\n",
       "      <th>296</th>\n",
       "      <th>297</th>\n",
       "      <th>298</th>\n",
       "      <th>299</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.696664</td>\n",
       "      <td>0.903903</td>\n",
       "      <td>-0.625330</td>\n",
       "      <td>-1.004056</td>\n",
       "      <td>0.304315</td>\n",
       "      <td>0.757687</td>\n",
       "      <td>-0.585106</td>\n",
       "      <td>1.063758</td>\n",
       "      <td>0.361671</td>\n",
       "      <td>-1.063279</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.586864</td>\n",
       "      <td>0.098197</td>\n",
       "      <td>1.739277</td>\n",
       "      <td>-0.427558</td>\n",
       "      <td>1.084251</td>\n",
       "      <td>-2.500275</td>\n",
       "      <td>1.844900</td>\n",
       "      <td>0.923524</td>\n",
       "      <td>-0.471286</td>\n",
       "      <td>-0.478899</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.888799</td>\n",
       "      <td>-0.449773</td>\n",
       "      <td>1.340381</td>\n",
       "      <td>-3.644667</td>\n",
       "      <td>2.221354</td>\n",
       "      <td>-2.437322</td>\n",
       "      <td>-1.399687</td>\n",
       "      <td>0.539550</td>\n",
       "      <td>2.563507</td>\n",
       "      <td>0.984283</td>\n",
       "      <td>...</td>\n",
       "      <td>0.932557</td>\n",
       "      <td>0.607203</td>\n",
       "      <td>-0.594103</td>\n",
       "      <td>-0.159929</td>\n",
       "      <td>-1.501902</td>\n",
       "      <td>-1.217742</td>\n",
       "      <td>0.115345</td>\n",
       "      <td>1.562480</td>\n",
       "      <td>-0.023147</td>\n",
       "      <td>-0.065639</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.589862</td>\n",
       "      <td>4.321714</td>\n",
       "      <td>-0.652215</td>\n",
       "      <td>5.326607</td>\n",
       "      <td>-8.739010</td>\n",
       "      <td>0.005590</td>\n",
       "      <td>1.371678</td>\n",
       "      <td>-0.868081</td>\n",
       "      <td>-1.485593</td>\n",
       "      <td>-2.200574</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.301250</td>\n",
       "      <td>0.632217</td>\n",
       "      <td>2.265594</td>\n",
       "      <td>-2.135824</td>\n",
       "      <td>2.925084</td>\n",
       "      <td>-0.933688</td>\n",
       "      <td>-0.872354</td>\n",
       "      <td>-0.567039</td>\n",
       "      <td>-3.797528</td>\n",
       "      <td>-2.027258</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.029406</td>\n",
       "      <td>-0.387385</td>\n",
       "      <td>0.504282</td>\n",
       "      <td>-1.223156</td>\n",
       "      <td>-0.733892</td>\n",
       "      <td>0.389869</td>\n",
       "      <td>-1.111555</td>\n",
       "      <td>-0.703193</td>\n",
       "      <td>3.405883</td>\n",
       "      <td>0.458893</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.293309</td>\n",
       "      <td>0.615899</td>\n",
       "      <td>0.109569</td>\n",
       "      <td>0.809128</td>\n",
       "      <td>0.798448</td>\n",
       "      <td>-1.626398</td>\n",
       "      <td>0.340430</td>\n",
       "      <td>1.064533</td>\n",
       "      <td>-0.892466</td>\n",
       "      <td>-0.318342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.343473</td>\n",
       "      <td>2.814057</td>\n",
       "      <td>-2.822986</td>\n",
       "      <td>1.471130</td>\n",
       "      <td>-4.252637</td>\n",
       "      <td>0.117415</td>\n",
       "      <td>3.309642</td>\n",
       "      <td>0.895924</td>\n",
       "      <td>-2.021818</td>\n",
       "      <td>-0.558035</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.075477</td>\n",
       "      <td>0.950246</td>\n",
       "      <td>4.536721</td>\n",
       "      <td>-1.728554</td>\n",
       "      <td>2.433016</td>\n",
       "      <td>-1.895700</td>\n",
       "      <td>-0.214796</td>\n",
       "      <td>0.251841</td>\n",
       "      <td>-3.280589</td>\n",
       "      <td>-3.242330</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 300 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        0         1         2         3         4         5         6    \\\n",
       "0 -0.696664  0.903903 -0.625330 -1.004056  0.304315  0.757687 -0.585106   \n",
       "1  0.888799 -0.449773  1.340381 -3.644667  2.221354 -2.437322 -1.399687   \n",
       "2  0.589862  4.321714 -0.652215  5.326607 -8.739010  0.005590  1.371678   \n",
       "3 -1.029406 -0.387385  0.504282 -1.223156 -0.733892  0.389869 -1.111555   \n",
       "4 -2.343473  2.814057 -2.822986  1.471130 -4.252637  0.117415  3.309642   \n",
       "\n",
       "        7         8         9      ...          290       291       292  \\\n",
       "0  1.063758  0.361671 -1.063279    ...    -2.586864  0.098197  1.739277   \n",
       "1  0.539550  2.563507  0.984283    ...     0.932557  0.607203 -0.594103   \n",
       "2 -0.868081 -1.485593 -2.200574    ...    -1.301250  0.632217  2.265594   \n",
       "3 -0.703193  3.405883  0.458893    ...    -2.293309  0.615899  0.109569   \n",
       "4  0.895924 -2.021818 -0.558035    ...    -2.075477  0.950246  4.536721   \n",
       "\n",
       "        293       294       295       296       297       298       299  \n",
       "0 -0.427558  1.084251 -2.500275  1.844900  0.923524 -0.471286 -0.478899  \n",
       "1 -0.159929 -1.501902 -1.217742  0.115345  1.562480 -0.023147 -0.065639  \n",
       "2 -2.135824  2.925084 -0.933688 -0.872354 -0.567039 -3.797528 -2.027258  \n",
       "3  0.809128  0.798448 -1.626398  0.340430  1.064533 -0.892466 -0.318342  \n",
       "4 -1.728554  2.433016 -1.895700 -0.214796  0.251841 -3.280589 -3.242330  \n",
       "\n",
       "[5 rows x 300 columns]"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import stopwords\n",
    "eng_stopwords = set(stopwords.words('english'))\n",
    "\n",
    "def clean_text(text, remove_stopwords=False):\n",
    "    text = BeautifulSoup(text, 'html.parser').get_text()\n",
    "    text = re.sub(r'[^a-zA-Z]', ' ', text)\n",
    "    words = text.lower().split()\n",
    "    if remove_stopwords:\n",
    "        words = [w for w in words if w not in eng_stopwords]\n",
    "    return words\n",
    "\n",
    "def to_review_vector(review):\n",
    "    global word_vec\n",
    "    \n",
    "    review = clean_text(review, remove_stopwords=True)\n",
    "    #print (review)\n",
    "    #words = nltk.word_tokenize(review)\n",
    "    word_vec = np.zeros((1,300))\n",
    "    for word in review:\n",
    "        #word_vec = np.zeros((1,300))\n",
    "        if word in model:\n",
    "            word_vec += np.array([model[word]])\n",
    "    #print (word_vec.mean(axis = 0))\n",
    "    return pd.Series(word_vec.mean(axis = 0))\n",
    "\n",
    "train_data_features = df.review.apply(to_review_vector)\n",
    "train_data_features.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from sklearn.cross_validation import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(train_data_features,df.sentiment,test_size = 0.2, random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall metric in the testing dataset:  0.87969004894\n",
      "accuracy metric in the testing dataset:  0.865\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nOCLOzCn74Nv61QYYBBwUEWPSsiOBiZJ6R8R4ST2AXUnezDMhjRkCPCzp1IiYWuj9uOdqZmaZKWlI\nuNRdnb69pkh6me9IGilpmqTnJe2TE9aLpEP5RHVBREwCJgN906KtgVnViTU1mqSn3KeYNjm5mplZ\ndkpNrMu3oqk98B3gdOARYGfgPuBeSdumMR2BhRExJ+/caemx6pjpuQcjYjEwMyemIB4WNjOzzDTQ\nauHqjuL9EVH9HvDXJP0IOI5kLnaFcnI1M7MVatbr/+KL/zxZo2zx118uT5UzgG+AiXnlE4F+6ddT\ngeaS2uT1Xjukx6pj8lcPNwXa5cQUxMnVzMwyU8jewu02H0C7zQfUKJv/2du8fe3xJV0zIhZJegHo\nnndoY+Cj9OuXSBLwAJIhYyR1B7oCz6UxzwFrSOqZM+86gOS2xhXTJidXMzPLTH0NC6fPmnbj2z3+\nN5S0BTAzIj4G/gzcIelp4Elgd2BPYDuAiJgj6QZgmKRZwFzgcmBsRIxPY96SNAq4TtLxQHPgCuD2\nYlYKg5OrmZllqNSVvwWcsxVJ0oz0c0lafjMwKCLul3Qc8BvgMmASsF9EPJdTxynAYmAE0ILk0Z4T\n865zMHAlySrhqjR2aLH34+RqZmaNXvpsap1PuETETcBNdRxfAAxJP0uL+QI4tKRG5nByNTOzzHhv\n4YSTq5mZZafUDSEqLLs6uZqZWWaS1cKlnVdJnFzNzCwz9bigqax4+0MzM7OMuedqZmaZ8YKmhJOr\nmZllxsPCCSdXMzPLTqkvuKms3Oo5VzMzs6y552pmZpkpZOP+pZ1XSZxczcwsM17QlHByNTOzzHhB\nU8LJ1czMMuPkmvCCJjMzs4y552pmZtnxoziAk6uZmWVIlDgsXGHZ1cnVzMwy49XCCc+5mpmZZcw9\nVzMzy4xXCyecXM3MLDMeFk44uZqZWWYk0cQ9VydXMzPLjnuuCS9oMjMzy5h7rmZmlhm/FSfhnquZ\nmWVGgiYlfJaVjyVtK+lBSZ9KqpK0dx2xf01jTsorbyHpKkkzJM2VNEJS+7yYtpJulTRb0ixJ10tq\nXezPwcnVzMwyU/0oTimfZWgNvAKcAEQd1/8J0Af4tJbDw4E9gIFAf6AzcE9ezG1AD2BAGtsfuGaZ\nN57Hw8JmZtboRcRIYCSAlpKJJa0DXAbsCjySd6wNMAg4KCLGpGVHAhMl9Y6I8ZJ6pOf2iogJacwQ\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26351168780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "LR_model = LogisticRegression()\n",
    "LR_model = LR_model.fit(X_train, y_train)\n",
    "y_pred = LR_model.predict(X_test)\n",
    "cnf_matrix = confusion_matrix(y_test,y_pred)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "print(\"accuracy metric in the testing dataset: \", (cnf_matrix[1,1]+cnf_matrix[0,0])/(cnf_matrix[0,0]+cnf_matrix[1,1]+cnf_matrix[1,0]+cnf_matrix[0,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
